package com.yc.cloud.admin.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.yc.cloud.admin.dto.request.HwDeviceCreateReqDTO;
import com.yc.cloud.admin.dto.request.HwDevicePageReqDto;
import com.yc.cloud.admin.dto.request.HwDeviceRegisterReqDTO;
import com.yc.cloud.admin.dto.request.HwDeviceUpdateReqDTO;
import com.yc.cloud.admin.vo.HwDeviceVo;
import com.yc.cloud.common.orm.CommonPage;
import com.yc.cloud.entity.HwDevice;
import com.yc.cloud.entity.HwCamera;
import com.yc.cloud.admin.vo.HwCameraVo;

import java.util.List;

/**
 * <p>
 *  硬件设备表 (AI盒子) 服务类
 * </p>
 *
 * @author kinggu
 * @since 2025-07-15
 */
public interface HwDeviceService extends IService<HwDevice> {

    /**
     * 注册设备
     * @param dto
     * @return HwDeviceVo
     */
    HwDeviceVo register(HwDeviceRegisterReqDTO dto);

    /**
     * 根据SN获取设备
     * @param deviceSn
     * @return
     */
    HwDevice getByDeviceSn(String deviceSn);

    boolean create(HwDeviceCreateReqDTO createReqDTO);

    boolean update(HwDeviceUpdateReqDTO updateReqDTO);

    CommonPage<HwDeviceVo> list(HwDevicePageReqDto pageReqDTO);

    HwDeviceVo getVOById(Long id);

    List<HwDeviceVo> convertToVoList(List<HwDevice> entityList);

    HwDevice get(Long id);

    boolean delete(Long id);
    
    /**
     * 解绑指定分组下的所有设备
     * @param groupId 分组ID
     * @return 是否成功
     */
    boolean unbindDevicesFromGroup(Long groupId);
    
    /**
     * 将设备绑定到指定分组
     * @param groupId 分组ID
     * @param deviceIds 设备ID列表
     * @return 是否成功
     */
    boolean bindDevicesToGroup(Long groupId, List<Long> deviceIds);

    /**
     * 置顶设备
     * @param id 设备ID
     * @return 是否成功
     */
    boolean pin(Long id);

    /**
     * 取消置顶
     * @param id 设备ID
     * @return 是否成功
     */
    boolean unpin(Long id);

    /**
     * 绑定摄像头到设备
     * @param deviceId 设备ID
     * @param cameraIds 摄像头ID列表
     * @return 是否成功
     */
    boolean bindCameras(Long deviceId, List<Long> cameraIds);


    /**
     * 解绑设备下的所有摄像头
     * @param deviceId 设备ID
     * @return 是否成功
     */
    boolean unbindCameras(Long deviceId);

    /**
     * 解绑指定的摄像头
     * @param deviceId 设备ID
     * @param cameraIds 要解绑的摄像头ID列表
     * @return 是否成功
     */
    boolean unbindSpecificCameras(Long deviceId, List<Long> cameraIds);

    /**
     * 获取设备绑定的摄像头ID列表
     * @param deviceId 设备ID
     * @return 摄像头ID列表
     */
    List<Long> getBoundCameraIds(Long deviceId);

    /**
     * 获取设备绑定的摄像头列表
     * @param deviceId 设备ID
     * @return 摄像头VO对象列表
     */
    List<HwCameraVo> getBoundCameras(Long deviceId);

    /**
     * 检查设备和摄像头是否已绑定
     * @param deviceId 设备ID
     * @param cameraId 摄像头ID
     * @return 是否已绑定
     */
    boolean isCameraBound(Long deviceId, Long cameraId);

    /**
     * 刷新设备数据，包括设备分组相关统计信息
     * @return 是否成功
     */
    boolean refreshData();
} 